<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 对象扩展

        // 1) Object.is 比较两个值是否严格相等，与『===』行为基本一致（+0 与 NaN）
        const a1 = [10,20,30];
        const a2 = [10,20,30];
        const a3 = a1;

        console.log(a1 === a2); // false
        console.log(a1 === a3); // true
        
        // 使用Object.is()判断
        console.log(Object.is(a1, a2));  // false
        console.log(Object.is(a1, a3));  // true

        console.log(Object.is(100, 100));  // true

        
        // 区别
        console.log(NaN === NaN); // false 因为NaN不能参与运算，所有返回false
        console.log(Object.is(NaN, NaN)); // true

        console.log("=".repeat(40));

        //2) Object.assign 对象的合并，将源对象的所有可枚举属性，复制到目标对象
        const ob1 = {name:"zhangsan",age:20};
        const ob2 = {sex:"man",num:100};
        const ob3 = {city:"beijing",age:30};
        // 将上面3个对象合并出一个对象
        const res = Object.assign(ob1, ob2, ob3); // 将ob2和ob3都合并到ob1上
        console.log(res);
        console.log(ob1 === res); //true

        // 应用：可以通过此种方式实现对象的浅拷贝（复制）
        const oa = {name:"zhangsan",age:20, oc:{aa:"bb"}};
        // 将oa对象浅拷贝一份给ob
        const ob = Object.assign({}, oa); // 将oa对象合并到前面的空对象{}中，实现拷贝
        console.log(ob);
        console.log(oa === ob);
        // 为什么叫浅拷贝,因为拷贝oa，但是里面的子对象oc属性并没有拷贝。
        console.log(oa.oc === ob.oc);


        console.log("=".repeat(40));
        //3) __proto__、setPrototypeOf、 setPrototypeOf可以直接设置对象的原型

        const o1 = {name:"zhangsan",age:20};

        const o2 = {num:100};

        // 可以使用 __proto__直接设置原型对象
        o2.__proto__ = o1;
        
        console.log(o2.num); // 100
        console.log(o2.name);// zhangsan
        console.log(o2.age); // 20

    </script>

</body>
</html>